package eventbus

/* //* 系统事件定义文件，提供节点、用户、消息等业务事件类型及常量，支持通过事件总线传递结构化数据 */

/*
本文件定义了系统中常用的具体事件类型及对应的事件名称常量，
基于BaseEvent扩展，携带特定业务场景的附加信息，便于组件间通过事件总线传递结构化数据。
*/

// 事件名称常量：定义系统中常用事件的唯一标识，统一事件名称规范，避免硬编码字符串导致的不一致问题
const (
	EventNodeRegistered   = "node.registered"   // 节点注册事件：当新节点完成注册时发布
	EventNodeUnregistered = "node.unregistered" // 节点注销事件：当节点从系统中注销时发布
	EventUserConnected    = "user.connected"    // 用户连接事件：当用户建立连接时发布
	EventUserDisconnected = "user.disconnected" // 用户断开事件：当用户连接断开时发布
	EventMessageReceived  = "message.received"  // 消息接收事件：当系统收到消息时发布
	EventMessageSent      = "message.sent"      // 消息发送事件：当系统发送消息后发布
	EventMatchmakingStarted = "matchmaking.started" // 匹配开始事件：当匹配流程启动时发布
	EventMatchmakingSuccess = "matchmaking.success" // 匹配成功事件：当玩家匹配成功时发布
	EventMatchmakingFailed  = "matchmaking.failed"  // 匹配失败事件：当匹配过程出现错误时发布
	EventDebug               = "debug"               // 调试事件：用于开发调试
	EventMatchmakingCancelled = "matchmaking.cancelled" // 匹配取消事件：当玩家取消匹配时发布
	EventSessionStateChanged = "session.state.changed" // 会话状态变更事件：当会话状态发生变化时发布
	EventSessionExpired      = "session.stats.expired"       // 会话过期事件：当会话超时时发布
	EventSessionStatsUpdated = "session.stats.updated" // 会话统计更新事件：当会话统计信息发生变化时发布
)

// NodeEvent 节点相关事件，继承BaseEvent的基础功能，附加节点特有属性，
// 用于节点注册、注销等场景的事件传递
type NodeEvent struct {
	BaseEvent        // 嵌入基础事件指针，继承Name()和Data()方法，实现Event接口
	NodeID    string // 节点唯一标识：用于区分不同节点（如服务器节点、设备节点）
	NodeType  string // 节点类型：描述节点的功能类型（如"api-node"、"storage-node"）
	Address   string // 节点网络地址：节点的通信地址（如"192.168.1.100:8080"）
}

// NewNodeEventBus 创建节点事件实例（注：函数名疑似笔误，建议修正为NewNodeEvent）
// 参数：
//   name: 事件名称，应使用本文件定义的节点相关常量（如EvnentNoteRegistered）
//   nodeID: 节点唯一标识字符串
//   nodeType: 节点类型描述字符串
//   address: 节点的网络地址字符串
//   data: 事件携带的额外数据（如节点注册时的元信息）
// 返回值：
//   *NodeEvent: 初始化后的节点事件实例
func NewNodeEventBus(name, nodeID, nodeType, address string, data interface{}) *NodeEvent {
	return &NodeEvent{
		BaseEvent: *NewBaseEvent(name, data), // 初始化基础事件部分
		NodeID:    nodeID,                    // 赋值节点唯一标识
		NodeType:  nodeType,                  // 赋值节点类型
		Address:   address,                   // 赋值节点地址
	}
}

// UserEvent 用户相关事件，继承BaseEvent的基础功能，附加用户和连接特有属性，
// 用于用户连接、断开等场景的事件传递
type UserEvent struct {
	BaseEvent        // 嵌入基础事件指针，继承Name()和Data()方法，实现Event接口
	UserID    string // 用户唯一标识：用于区分不同用户（如用户账号ID、UUID）
	ConnID    string // 连接唯一标识：用户当前连接的会话ID，用于跟踪单用户的多连接场景
}

// NewUserEventBus 创建用户事件实例（注：函数名疑似笔误，建议修正为NewUserEvent）
// 参数：
//   name: 事件名称，应使用本文件定义的用户相关常量（如EventUserConnected）
//   userID: 用户唯一标识字符串
//   connID: 连接会话唯一标识字符串
//   data: 事件携带的额外数据（如用户连接时的设备信息）
// 返回值：
//   *UserEvent: 初始化后的用户事件实例
func NewUserEventBus(name, userID, connID string, data interface{}) *UserEvent {
	return &UserEvent{
		BaseEvent: *NewBaseEvent(name, data), // 初始化基础事件部分
		UserID:    userID,                    // 赋值用户唯一标识
		ConnID:    connID,                    // 赋值连接会话标识
	}
}

// MessageEvent 消息相关事件，继承BaseEvent的基础功能，附加消息传输特有属性，
// 用于消息接收、发送等场景的事件传递
type MessageEvent struct {
	BaseEvent        // 嵌入基础事件指针，继承Name()和Data()方法，实现Event接口
	Route     uint32 // 消息路由标识：用于消息的路由分发（如区分不同业务模块的消息）
	SessionID string // 会话ID：关联消息所属的用户会话（与UserEvent.ConnID对应）
	// Data      []byte // 消息原始数据：二进制形式的消息内容（如序列化后的协议数据）
	// 这个Data和Data()冲突，不能要
}

// NewMessageEvent 创建消息事件实例
// 参数：
//   name: 事件名称，应使用本文件定义的消息相关常量（如EventMessageReceived）
//   sessionID: 消息所属的会话ID字符串
//   route: 消息路由标识（无符号32位整数）
//   data: 消息原始二进制数据（[]byte类型）
// 返回值：
//   *MessageEvent: 初始化后的消息事件实例
func NewMessageEvent(name, sessionID string, route uint32, data []byte) *MessageEvent {
	return &MessageEvent{
		BaseEvent: *NewBaseEvent(name, data), // 初始化基础事件部分（注意：BaseEvent的Data()会返回此处的data参数）
		Route:     route,                     // 赋值消息路由标识
		SessionID: sessionID,                 // 赋值会话ID
		// Data:      data,                     // 赋值消息原始数据
	}
}
